package iscript.gameFramework.NetService.util
{

	public class BigIntCovertor
	{
		/** 
		 * 
		 * AS3 读写 C++ 64位数字
		 * 
		 * 核心思路：
		 * 低位——对DEC和BIN，低位都是用十进制表达的；
		 * 高位——BIN的高位的值等于DEC高位值乘以2^32
		 * 
		 * */
		
		/*
		public static function Binary2Decimal($d:BigInt):BigInt
		{
			var result:BigInt = new BigInt;
			result.up = $d.up;
			result.down = $d.down;
			
			/** 
			 * 
			 * STEP1、二进制高位 表示成 十进制 tempD
			 * STEP2、二进制低位 + tampD低位是否有进位
			 * 是：去掉进位 ，保留剩余部分为结果低位
			 * 否：直接获得结果低位
			 * STEP3、进位 + tempD高位 = 结果高位
			 * 
			 * */
			
			/* STEP 1
			var tempD:BigInt = new BigInt;
			tempD.up = Math.floor($d.up * Math.pow(2, 32) / Math.pow(10, 9));
			tempD.down = $d.up * Math.pow(2, 32) - Math.pow(10, 9) * Math.floor($d.up * Math.pow(2, 32) / Math.pow(10, 9));
			
			// STEP 2
			var carry:int = Math.floor(($d.down + tempD.down)/Math.pow(10, 9));
			if(carry>0)
			{
				result.displayDown = $d.down + tempD.down - carry * Math.pow(10,9);
			}else
			{
				result.displayDown = $d.down + tempD.down;
			}
			
			// STEP 3
			result.displayUp = carry + tempD.displayUp;
			
			// 返回结果
			return result;
			
		}
		*/
		
		
		static public function toBigInt(num:Number):BigInt { 
				var long_l:uint = uint(num);				 
				var long_h:uint = (num - long_l)/4294967296;			
				var newBigInt:BigInt = new BigInt();
					newBigInt.high = long_h;
					newBigInt.light = long_l;
					return newBigInt;
		}
		
		static public function Binary2Decimal2($d:BigInt):BigInt
		{
			var result:Number = $d.high * Math.pow(2,32) + $d.light;	
			return $d;
		}
		
		
		static public function toNumber($d:BigInt):Number
		{
			var result:Number = $d.high * Math.pow(2,32) + $d.light;
            return  result;
		}
		
		static public function Decimal2Binary($d:BigInt):BigInt
		{
//			var result:BigInt = new BigInt;
			/** 
			 * 
			 * STEP1、高位乘10e9后除以2e32，取整得结果高位，记录余数
			 * STEP2、余数加原低位得到结果低位
			 * 
			 * */
/*			
			// STEP 1
			result.up = Math.floor($d.up * Math.pow(10, 9) / Math.pow(2, 32));
			var remainder:uint = $d.up * Math.pow(10, 9) - result.up * Math.pow(2, 32);
			
			// STEP 2
			result.down = $d.down + remainder;
			
			return result;
			*/
			return $d;
		}
	}
}